package com.wx.ssm.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;

/**
 * @author shkstart
 * @create 2020-05-08 15:09
 */
@Component("LogAnnotation") //等同于将该类纳入springIoc容器中
//@Aspect：声明该类是一个通知
@Aspect
public class LogAnnotation {
    //通知与业务类直接连接，无需在springIoc容器配置
    //前置通知
    //获取目标对象参数需要使用的对象：
    //环绕通知为：ProceedingJoinPoint，其他通知为：JoinPoint
//    @Before("execution(public void com.wx.ssm.aop.impl.StudentServiceImp.addStudent(com.wx.ssm.aop.Student))")//属性：定义切点
//    public void myBefore(JoinPoint jp){
//        System.out.println("【注解】前置通知：目标对象"+jp.getTarget()+"，方法名"+jp.getSignature().getName()+"，参数列表"+ Arrays.toString(jp.getArgs()));
//    }

    //后置通知
    @AfterReturning(pointcut = "execution(public String com.wx.ssm.aop.impl.StudentServiceImp.addStudent(com.wx.ssm.aop.Student))",returning = "returningValue")
    public void myAfterreturing(JoinPoint jp,Object returningValue){//returingValue是返回值，但需要告诉spring
        System.out.println("【注解】后置通知：目标对象"+jp.getTarget()+"，方法名"+jp.getSignature().getName()+"，参数列表"+ Arrays.toString(jp.getArgs())+"，返回值为："+returningValue);
    }

   // 环绕通知
//    @Around("execution(public void com.wx.ssm.aop.impl.StudentServiceImp.addStudent(com.wx.ssm.aop.Student))")
//    public void myAround(ProceedingJoinPoint jp){
//        //方法执行之前：前置通知
//        System.out.println("【注解-环绕】前置通知");
//        try{
//            //方法执行时
//            jp.proceed();
//            //方法执行之后：后置通知
//            System.out.println("【注解-环绕】后置通知");
//        }catch (Throwable e){
//            //发生异常时：异常通知
//            System.out.println("【注解-环绕】异常通知");
//        }finally {
//            //最终通知
//            System.out.println("【注解-环绕】最终通知");
//        }
//    }
//    //异常通知：如果只捕获特定类型的异常，则可以通过第二个参数实现
//    @AfterThrowing("execution(public void com.wx.ssm.aop.impl.StudentServiceImp.addStudent(com.wx.ssm.aop.Student))")
//    public void myException(){
//        System.out.println("【注解】异常通知");
//    }
//    //最终通知
//    @After("execution(public void com.wx.ssm.aop.impl.StudentServiceImp.addStudent(com.wx.ssm.aop.Student))")
//    public void myAfter(){
//        System.out.println("【注解】最终通知");
//    }
}

